昨天稍微介紹了 Array
,今天緊接著來了解同樣在JavaScript也有的 Object 型別。
在 array
那段已經提早預告了物件(object)型別的使用方式,這裡再複述一次TypeScript的物件型別宣告和賦值方式,這裡我們宣告了一個 person
物件,而且必須包含三個屬性 - id
、name
、isMarried
:
// TypeScript
let person: {
id: number,
name: string,
isMarried: boolean
} = {
id: 1,
name: "Alice",
isMarried:false;
};
也可以先宣告,後賦值:
// TypeScript
let person: {
id: number,
name: string,
isMarried: boolean
};
person = {
id: 1,
name: "Alice",
isMarried:false;
};
另外,在JavaScript裡,如果想要存取一個物件內部不存在的屬性(property)就會回傳 undefined
;不過在TypeScript世界裡則是出現編譯錯誤:
// JavaScript
console.log(person.occupation); // undefined
// TypeScript
console.log(person.occupation); // error
到這邊可以稍微注意一下,前面建立一個 person
物件有提到「id
、name
、isMarried
是必須包含在這個物件的屬性」,有些時候某幾個屬性可能不是必要的,例如有些人不想讓其他人知道他結婚了沒,此時可以在屬性名稱後面加上一個特殊的符號 ?
,讓TypeScript知道這是可有可無的屬性,同時,如果沒有對這個屬性賦值,存取這個屬性就會回傳 undefined
。
來稍微修改一下前面的範例:
let person: {
id: number,
name: string,
isMarried?: boolean
};
person = {
id: 1,
name: "Alice",
};
console.log(person.isMarried); // undefined
person
的宣告方式等價於下面兩種宣告方式:
let person: {
id: number,
name: string,
isMarried?: boolean | undefined
};
// or
let person: {
id: number,
name: string,
isMarried: boolean | undefined
};
前面是針對一個物件型別變數,指定物件包含的屬性、屬性型別,以及是否為非必要屬性。
假設今天要建立很多個擁有相同屬性的物件變數,像前面那樣一個變數需要個別指定一次物件型別實在是太麻煩了,也因此這裡先提前介紹一個後面章節才會說明的好東西 - interface
(中文可譯作 介面 或 接口)。
interface
可以讓開發者提前建立一個物件型別的 模板,再次將前面範例用 interface
改寫,並多建立幾個和 person
擁有相同屬性的物件變數:
interface Person {
id: number;
name: string;
isMarried?: boolean;
};
let person1: People = {
id: 1,
name: "Alice",
}
let person2: People = {
id: 2,
name: "Ban",
isMarried: true
}
let person3: People = {
name: "Crow", // error
isMarried: false
}
可以看見 person1
、person2
、person3
都是指定為預先建立好、名為 Person
型別的物件變數,其中 person1
雖然沒有包含 isMarried
屬性卻也是可以的;相反地, person3
不包含 id
屬性就會出現編譯錯誤。
由以上例子能看到,對於使用 TypeScript 的開發者而言,在處理物件類型變數時,interface
和 ?
是兩個相當方便的特性,畢竟有很多資料都是以物件形式儲存,但是每一份資料的內容可能不是很完整、但卻共同擁有許多一樣的屬性,而透過這兩個特性就能讓開發變得更有彈性、更貼近真實世界的需求。
最後,再介紹一個特別的型別,{}
(empty type),這個型別代表沒有屬性的空物件,雖然我還沒很清楚它的應用在,不過這個空物件型別可以透過原型鍊(prototype chain)去存取內建 Object
型別的屬性和方法,例如:
let emptyObj: {} = {};
console.log(emptyObj.toString()); // [object Objecy]
參考資料
TypeScript: JavaScript With Syntax For Types
Optional Properties
TypeScript Tutorial